// 根据 输入的类型，决定 输出的类型，就叫条件类型

// 语法 A extends B? C : D   ,如果A类型包含B类型，就返回C类型，否则返回D类型
// A类型一般是传入的泛型参数，

// 泛型约束
type MessageOf<T extends {message:unknown}> = T["message"];

// 条件类型约束
type MessageOf1<T> =T extends {message:unknown}? T["message"]:unknown;

type Aq =  string[] | number[]
type Bq = (string|number)[]
// Aq 和 Bq之间的区别是什么
const dadas:Aq = [1]
const ddas:Aq = ['1']
// const ddas1:Aq = ['1',1]
const sdf:Bq = [1]
const sdf2:Bq = ['1']

type fdaew = number|string
type  dsa<T> =[T] extends any ?T[]:unknown 
type dsada =dsa<fdaew>
const sdf32:dsada = ['1',1]
// [T]表示不拆分T类型，T类型当做整体使用


// 在条件类型中使用infer推断
    // 1、infer
        // 是什么？
            // ts提供的关键字，用来声明一个类型变量，这个类型变量不需要你额外的传入一个类型参数值，它会根据，传入的 条件类型 的 判断项 来推测出具体地类型值，并且可以在整个条件类型中使用它
    // 2、条件类型推断
        // A类型 extends B类型(infer C类型变量) ? D类型(D类型中使用了C类型变量):E类型

